iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Python

探索 Python 世界:從語法基礎到圖像魔法系列 第 25

探索 Python 世界:從語法基礎到圖像魔法 Day25

  • 分享至 

  • xImage
  •  

今天要補充前圖像欲處理沒有講完的部分,主要會提及輪廓化、膨脹、侵蝕

圖片不是好好的嗎?為什麼要輪廓化?侵蝕跟膨脹又是什麼?為什麼做這些動作前又需要先用高斯模糊處理圖片?

高斯模糊處理圖片

在做輪廓化、膨脹、侵蝕前會先將圖片做高斯模糊的處理,主因是這樣可以避免邊緣被過度檢測,且高斯模糊能平滑圖像中的些微細節,有助於強調真實細節避免過多微小的變化

G = cv2.GaussianBlur(img, (15, 15), 0)

這邊我把高斯核設為 (15, 15),可以讓模糊更明顯

輪廓化

在圖像中檢測並突出顯示邊緣,這些邊緣常代表顏色或亮度發生劇烈變化的地方,透過邊緣檢測,可以提取出圖像中物體的形狀、結構,與其他重要的特徵

cv2.Canny(image, l, h)這個函數會先將 image 轉換成灰階圖像,在設定低閥值與高閥值參數

<補充>
低閥值:用來判定邊緣的強度
高閥值:用來判定邊緣的強度。強邊緣區域比弱邊緣更有可能是圖像中的真實邊緣

C = cv2.Canny(G, 50, 150)
cv2.imshow('Canny Cats', C)
cv2.waitKey(0)

膨脹

擴大圖像中白色或高亮部分的區域,通常是邊緣或前景。可以用來加粗物體的邊緣,填補邊緣中的小孔或間隙,在形態學操作中常與侵蝕結合使用

cv2.dilate(image, (9, 9), iterations=4)

將卷積核設為 (9, 9),來定義膨脹操作時的鄰域大小,iterations 表示要迭代次數,能加粗邊緣

D = cv2.dilate(C, (9, 9), iterations=4)
cv2.imshow('Dilated Cats', D)
cv2.waitKey(0)

<補充> 二值化:是將圖像中的像素值轉換為僅有兩種可能值(通常是 0 和 255)的圖像處理技術,這種圖像也被稱為二進制圖像或黑白圖像

侵蝕

縮小圖像中白色或高亮的部分區域。可以削弱或去除物體邊緣的細小雜訊,且能分離或去除圖像中不相連的物體

cv2.erode(image, (5, 5), iterations=2)

將卷積核設為(5, 5),erode 會把該區域內的最小值應用到中心像素上,從而「縮小」白色(或前景)區域,並利用 iterations 迭代 2 次

E = cv2.erode(D, (5, 5), iterations=2)
cv2.imshow('Eroded Cats', E)
cv2.waitKey(0)

輸出結果對比

https://ithelp.ithome.com.tw/upload/images/20241003/20168687PGXYc2j0wY.png

參考資料:
https://www.walnutpi.com/en/docs/opencv/detection/contour_detection/

https://medium.com/jimmy-wang/opencv-%E5%9F%BA%E7%A4%8E%E6%95%99%E5%AD%B8%E7%AD%86%E8%A8%98-with-python-d780f571a57a


上一篇
探索 Python 世界:從語法基礎到圖像魔法 Day24
下一篇
探索 Python 世界:從語法基礎到圖像魔法 Day26
系列文
探索 Python 世界:從語法基礎到圖像魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言